// 判断一个对象存在某个属性
let a = {
    name: 'tix',
    age: '28',
}
console.log('name' in a);

// 分隔线-----------------------------------------------------------------------

let foo = {
    a: 1,
    b: 2
}
let handler = {
    get: (obj, key) => {
        console.log('get')
        return key in obj ? obj[key] : undefined
    }
}
let { proxy, revoke } = Proxy.revocable(foo, handler)
console.log(proxy.a) // 打印1
// 撤回代理
revoke()
// console.log(proxy.a) // 报错信息：Uncaught TypeError: Cannot perform 'get' on a proxy that has been revoked

// 分隔线-----------------------------------------------------------------------

// new Set()可以用作字符串去重
console.log([...new Set('abccba')]);

// 分隔线-----------------------------------------------------------------------

// Set 结构的实例有以下属性。

// Set.prototype.constructor ：构造函数，默认就是 Set 函数。
// Set.prototype.size ：返回 Set 实例的成员总数。
// Set 实例的方法分为两大类：操作方法（用于操作数据）和遍历方法（用于遍历成员）。下面先介绍四个操作方法。
// Set.prototype.add(value) ：添加某个值，返回 Set 结构本身。
// Set.prototype.delete(value) ：删除某个值，返回一个布尔值，表示删除是否成功。
// Set.prototype.has(value) ：返回一个布尔值，表示该值是否为 Set 的成员。
// Set.prototype.clear() ：清除所有成员，没有返回值。

// 分隔线-----------------------------------------------------------------------

// 在Vue 3中，Composition API中会经常使用创建响应式对象的方法ref/reactive，其内部就是利用了Proxy API来实现的，特别是借助handler的set方法，
// 可以实现双向数据绑定相关的逻辑，这对于Vue 2中的Object.defineProperty()是很大的改变，主要提升如下：
// Object.defineProperty()只能单一的监听已有属性的修改或者变化，无法检测到对象属性的新增或删除（Vue2中是采用$set()方法来解决），而Proxy则可以轻松实现。
// Object.defineProperty()无法监听响应式数据类型是数组的变化（主要是数组长度变化，Vue2中采用重写数组相关方法并添加钩子来解决），而Proxy则可以轻松实现。
// 正是由于Proxy的特性，在原本使用Object.defineProperty()需要很复杂的方式才能实现的上面两种能力，在Proxy无需任何配置，利用其原生的特性就可以轻松实现。

// 分隔线-----------------------------------------------------------------------

// ref()方法运行原理

// 入口方法
// export function ref(value?: unknown) {
//     return createRef(value, false)
// }
// function createRef(rawValue: unknown, shallow: boolean) {
//     // rawValue表示原始对象，shallow表示是否递归
//     // 如果本身已经是ref对象，则直接返回
//     if (isRef(rawValue)) {
//         return rawValue
//     }
//     // 创建一个新的RefImpl对象
//     return new RefImpl(rawValue, shallow)
// }


// 分隔线-----------------------------------------------------------------------
